import { isClient } from '@opensig/opendesign';
import Cookies from 'js-cookie';

/**
 * 时间戳转 xxxx/xx/xx 格式时间
 * @param {number} timestamp 待转换时间戳
 * @returns {string} 返回格式化时间，如 2024/01/01
 */
export const changeTimeStamp = (timestamp: number) => {
  const date = new Date(timestamp * 1000);

  const year = date.getFullYear();
  const month = ('0' + (date.getMonth() + 1)).slice(-2);
  const day = ('0' + date.getDate()).slice(-2);

  return `${ year }/${ month }/${ day }`;
};

/**
 * URL参数转对象
 * @param {string} url 地址
 * @returns {(string|undefined)} 转换成功返回参数对象，失败返回 undefined
 */
export function getUrlParams(url: string) {
  const arrObj = url.split('?');
  if (arrObj.length > 1) {
    const arrPara = arrObj[1].split('&');
    const list = {} as any;
    for (let i = 0; i < arrPara.length; i++) {
      const item = arrPara[i].split('=');
      const key = item[0];
      const value = item[1];
      list[key] = value;
    }
    return list;
  }
}

/**
 * 滚动至顶部
 * @param {number} top 滑动到的顶部
 * @param {boolean} smooth 是否平滑滑动
 */
export const scrollToTop = (top: number = 0, smooth: boolean = true) => {
  if (isClient) {
    const dom = document.querySelector('#app > .o-scroller > .o-scroller-container');
    dom?.scrollTo({
      top,
      behavior: smooth ? 'smooth' : 'instant',
    });
  }
};

/**
 * 判断 key 是否存在于目标对象上
 * @param {(string|number|symbol)} key 待判断 key
 * @param {object} obj 目标对象
 * @returns {boolean} 存在返回 true，不存在返回 false
 */
export const isValidKey = (key: string | number | symbol, obj: object): key is keyof typeof obj => {
  return Object.prototype.hasOwnProperty.call(obj, key);
};

/**
 * 新窗口打开页面
 * @param url
 */
export const openWindow = (url: string, target = '_blank') => {
  return window.open(url, target, 'noreferrer');
};

/**
 * 当前窗口打开页面
 * @param url
 */

export const openUrl = (url: string) => {
  location.href = url;
};

/**
 * 根据key值返回环境变量
 */
export function getEnvConfig(key: string) {
  return import.meta.env[key];
}

/**
 * 获取指定时区偏移量的年份
 * @param {number} offset - 时区偏移量（单位：小时）。例如，UTC+8 时区，传入 8。
 * @returns {number} - 指定时区偏移量对应的年份
 */
export function getYearByOffset(offset = 8) {
  // 获取当前时间的 UTC 时间
  const now = new Date();
  const utcTime = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

  // 设置偏移
  utcTime.setHours(utcTime.getHours() + offset);

  return utcTime.getFullYear();
}


/**
 * 获取指定key的cookie值
 * @param {string} key cookie的key值
 * @returns {(string|undefined)} 若cookie中存在key则返回对应的value内容，否则返回undefined
 */
export function getCustomCookie(key: string) {
  return Cookies.get(key);
}

/**
 * 设置cookie
 * @param {string} key cookie的key
 * @param {string} value cookie的值
 * @param {number} [day=1] cookie的过期时间 默认1天
 */
export function setCustomCookie(key: string, value: string, day = 1) {
  Cookies.set(key, value, { expires: day, path: '/' });
}

/**
 * 删除cookie
 * @param {string} key cookie的key
 */
export function removeCustomCookie(key: string) {
  Cookies.remove(key);
}

// 时分秒 转换成 以秒为单位的格式 - xx秒
export const transformTime = (time: string) => {
  const arr = time.split(':');
  const hh = arr[arr.length - 3] ? parseInt(arr[arr.length - 3]) : 0;
  const mm = parseInt(arr[arr.length - 2]);
  const ss = parseFloat(arr[arr.length - 1]);

  return hh * 60 * 60 + mm * 60 + ss;
};

// 以秒为单位的格式 转换成 时分秒 - hh:mm:ss
export const transformSeconds = (seconds: number) => {
  const hh = Math.floor(seconds / 3600);
  const mm = Math.floor((seconds - hh * 3600) / 60);
  const ss = Math.floor(seconds - hh * 3600 - mm * 60);
  return `${ hh ? `${ hh.toString().padStart(2, '0') }:` : '' }${ mm.toString().padStart(2, '0') }:${ ss.toString().padStart(2, '0') }`;
};
